#ifndef PUB_VAR_H
#define PUB_VAR_H

#define _DEBUG_

#include <QString>
#include <QSettings>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QThread>
#include <QTableView>
#include <QComboBox>
#include <QElapsedTimer>
//#include "sm4.h"

#define u8 unsigned char
#define u32 unsigned long

class pub{
    //Q_OBJECT
private:
    static QSqlQuery qr;
    static QSqlQuery qrm;
//    static QSqlQueryModel md;

    static QString strChineseFirstPY;

private slots:
    //void postRequestFinished(QNetworkReply *);

public :

    static bool DEBUG;  //调试标志

    static QSqlDatabase db_o;   // oracle
    static QSqlDatabase db_m;   //mysql
    static bool userValidated;   //用户身份验证

    static bool useInsurance;   //医保动态库可用
    static QString ybywzq;      //医保业务周期号
    static QString ybywzqAtinc;      //申请交易流水号时的atinc，用于补全中心返回交易流水
    static QString localIP;     //本机IP
    static QString localMac;    //Mac
    static QString local_version;//本地程序版本号
    static QString hos_name;    //医院名称
    static QString hos_code;    //医院编码
    static QString hos_ybbh;    //医院医保编号

    static QString medins_type; //医疗服务机构类型
    static QString medins_lv; //医院等级

    static QString hos_ybbh_old;    //医院医保编号(旧)
//    static QString hos_ybbh_new;    //贯标医保编号
    static QString hos_ybjy;    //医保交易中台
    static QString hos_ybjy_ip;    //医保交易中台
    static QString hos_ybjy_port;    //医保交易中台
    static QString hos_ybjy_tail;    //医保交易中台

    static QString zj_push_ip;  //诊间，推送ip
    static QString app_id;
    static QString key_sm4;
    static QString key_pub_app;
    static QString key_private_app;
    static QString key_pub_pub;

    static QString hos_dzpz;    //电子凭证中台
    static QString hos_dzpz_ip;    //电子凭证中台
    static QString hos_dzpz_port;    //电子凭证中台
    static QString hos_dzpz_tail;    //电子凭证中台
    static QString hos_insuplc; //  参保区划
    static QString hos_hiscode; //  开发商代码
    static QString hos_secretcode; //  安全管理码
    static QString usr_name;    //用户姓名
    static QString usr_code;    //用户代码
    static QString dp_name;    //科室名称
    static QString dp_code;    //科室代码
    static QString dp_name_st;//标准名称
    static QString dp_code_st;//标准代码
    static QString LOGINSESSION;    //登录session
    static QString local_carddriver;  //本机读卡器型号
    static QString otp_mulaid_used_flag; //是否使用职工门诊共济
    static QString downloadPath;//文件下载路径
    static QString base_path;//当前工作路径

    static QString dr_codg;//医保医师编码
    static QString dr_senior;//带教医师编码
    static QString dr_profttl; //	医师职称	 字典表
    static QString dr_duty_range; //执业范围
    static QString sign_no; //登录ID
    static QString sign_time; //登录时间

    static QString druged_oper_code;//处方药品调配
    static QString send_oper_code;//处方药品发药

    static QElapsedTimer elps;

    static bool cardFinish;
    static int cardResult; //
    static QString cardRet1; //
    static QString cardRet2; //

    static QString getStr(QString sour,QString sep,int ct); //
    static int searchStr(QString sour,QString sep,QString dest);
    static QString getValueFromList(QStringList,QString); //从字典取字串值

    typedef __stdcall int(*pIT)(char*, char* );
    static pIT BUSINESS;      //

    //int WINAPI Init(char*pInitInfo,char *pErrMsg);
    typedef __stdcall int(*pInit)(char*, char* );
    static pInit Init;      //初始化

    //int WINAPI ReadCardBas(char*pCardInfo,char*pBusiCardInfo);
    typedef __stdcall int(*pReadCardBas)(char* ,char*);
    static pReadCardBas ReadCardBas;    //读卡

    //int WINAPI ReadSFZ(char*pOutBuff, char* pOutBusiBuff);
    typedef __stdcall int(*pReadSFZ)(char* ,char*);
    static pReadSFZ ReadSFZ;    //读身份证

    //int WINAPI EcQuery(char* pInData, char* pOutData);
    typedef __stdcall int(*pEcQuery)(char* ,char*);
    static pEcQuery EcQuery;    //电子凭证

    //int WINAPI DailySinIn(char* pOutData);
    typedef __stdcall int(*pDailySinIn)(char* );
    static pDailySinIn DailySinIn;    //签到

    //int WINAPI ChangePIN(char *pOutBuff);
    typedef __stdcall int(*pChangePIN)(char* );
    static pChangePIN ChangePIN;//修改密码

    static QString getDicN(QString, QString );   //查字典，由码查名 mysql
    static QString getDicC(QString, QString );   //查字典，由名查码 mysql
    static QString getDicN_o(QString, QString, QSqlQuery *qrt);   //查字典，由码查名 orc
    static QString getDicC_o(QString, QString, QSqlQuery *qrt );   //查字典，由名查码 orc

    static QString getYbStr(QString, QString );   //获取医保交易固定格式串，参数为医保交易号
    static QString getYbStrJ(QString, QString);   //获取医保交易固定格式串，参数为医保交易号
    static QStringList getNl(QString s);    //用出生日期（yyyymmdd）获取年龄
    static QString getBirth(QString s);    //用年龄获取出生日期
    static QString add0(QString, int); //根据指定长度补全前导 0
    static QString bigW(float);   //数字转大写
    static bool call_business(QString busi_code,        //医保交易代码
                              QJsonObject &input,          //医保交易入参
                              QString &info,            //返回错误信息
                              //QString &currentMsgid,    //当前信息ID
                              QJsonObject &jsonRet,      //医保交易出参
                              QString fileName ,           //非空，保存文件。保存文件则不返回jsonRet
                              bool saveOut,             //是否持久化保存出参
                              QNetworkAccessManager &manager, //
                              QNetworkRequest &request,
                              QString clinic_code = "");    //

    static bool call_busi_push(QString busi_code, QJsonObject &input, QString &info, //QString &currentMsgid,
                            QJsonObject &jsonRet, QString fileName , bool saveOut,
                            QNetworkAccessManager &manager, QNetworkRequest &request,
                            QString clinic_code);

    static QByteArray pkcs7_padding(QByteArray content);
    static QByteArray pkcs7_strip(QByteArray content);
    //static QByteArray enc(QByteArray source, QByteArray key);     //加密16字节长度字串
    static QString enc(QByteArray source, QByteArray key);     //加密16字节长度字串
    static QString dec(QByteArray source, QByteArray key);    //

    static QString encode(QByteArray inp, QByteArray key); //加密任意长度字串
    static QString decode(QByteArray inp, QByteArray key);

    static QString getFirstLetters(QString); //提取字符串拼音字头
    static void setColumnWidth(QTableView *, QString, int, int col_count = 20 );//表，列宽定义，表宽，总列数量
    static bool verifyIdCard(const char* idCard);   //身份证合法性校验
    static QString fillCombo(QComboBox *cbb, QString sq , int ind, bool clr = true);    //填充下拉列表
    static QString fillCombo(QComboBox *cbb, QString sq , int ind, QSqlQuery *qrt , bool clr = true);    //填充下拉列表
    static void printOutExcel(QJsonObject &js, int print_times = 1);//   调用 excel 打印输出
    static void export_sql_to_excel(QString, QSqlQuery*);  //导出sql查询为excel
    static int check_system_time(); //检查本机时间与服务器时间差
    static bool isAlmostEqual(double a, double b, double epsilon = 1e-5);
    static bool get_db_connect(QString);
    static QString gmssl_sm3(QString sour);
    static QString remove_trailing_zeros(const QString& );
};


#define ENV_WIN

#endif // PUB_VAR_H
